package com.hlm.analysis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
public class HuiGui {


//    @Autowired Tempreture tempreture;
    //    a供暖系数 b天气系数   c初始温度  results实际温度  x水温 y天气 learnRate 微调间隔
//    实现原理：每次将系数调整0.01  使得误差最小（在代码中体现为(result-预测的result)平方 求和最小）
//     误差导数：2*预测result  这时是每一条数据的。当求和时导数需要除以总条数
//     *********该方法需要循环使用
    public static void getParam(double a,double b,double c,double[] results,double[] x,double[] y,double learnRate){

        double sum =0;
//      循环微调a
        for (int j = 0; j < results.length; j++) {
            sum = sum + (a * x[j] + b * y[j] + c - results[j]) * x[j];
        }
//      调整的数值 即调整a与实际a的误差
        double updateValue = 2 * learnRate * sum / results.length;
        a = a - updateValue;
        System.out.println("a"+a);
//      循环微调b
        sum = 0;
        for (int j = 0; j < results.length; j++) {
            sum = sum + (a * x[j] + b * y[j]
                     + c - results[j]) * y[j];
        }
        updateValue = 2 * learnRate * sum / results.length;
        b = b- updateValue;
        System.out.println("b:::::"+b);
//        sum =0;
//        for (int j = 0; j < results.length; j++) {
//            sum = sum + (a * x[j] + b * y[j] + c - results[j]) * y[j];
//        }
//        updateValue = 2 * learnRate * sum / results.length;
//        b= b - updateValue;
//        System.out.println("b"+b);
//       循环微调c
        sum =0;
        for (int j = 0; j < results.length; j++) {
            sum = sum + (a * x[j] + b * y[j] + c - results[j]) ;
        }
        updateValue = 2 * learnRate * sum / results.length;
        c = c - updateValue;
        sum =0;
        System.out.println("c"+c);
    }

/*    public void goAnalysis() {
//        设定所有初始值
        double a=0.01;
        double b=0.01;
        double c=0.01;


//        double[] results=tempreture.getInTemp();
//
//
//        double[] x=tempreture.getWaterTemp();
//        double[] y=tempreture.getOutTemp();
//        double learnRate=0.01;
//        System.out.println("results:"+results+"water(x):"+"out(y)"+y);
        //循环调方法
//        for(int i = 0 ; i <1000 ; i++){
//            getParam(a,b,c,results,x,y,learnRate);
//        }
    }*/

}
